/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controller;

import Controller.Calculadora;
import Model.Celdam;
import Model.DatosSecuencia;
import Model.twoWays;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

/**
 *
 * @author Jhonatan
 */
public class MatrizDatos {

    Celdam matriz[][];//matriz de datos

    public void agregarDato(Celdam cel, int posX, int posY, int filas, int columnas) {
        matriz = twoWays.getMatriz();
        if (matriz == null) {
            matriz = new Celdam[filas][columnas];
        }

        matriz[posX][posY] = cel;
        twoWays.setMatriz(matriz);
    }

    public Celdam[][] generarMatriz(Celdam matriz[][]) {
        for (int i = 0; i < twoWays.getI(); i++) {
            for (int j = 0; j < twoWays.getJ(); j++) {
                Calculadora c = new Calculadora();
                double num = 0;
                ArrayList<Double> valores = new ArrayList<Double>();
                for (int k = 0; k < matriz[i][j].getDatos(); k++) {

                    num = c.generarDatos(twoWays.getGranMedia(), twoWays.getBeta(), twoWays.getI()-1,
                            twoWays.getJ()-1, matriz[i][j].getLambda1(), matriz[i][j].getLambda2(), matriz[i][j].getLambda3(), matriz[i][j].getLambda4());
                    valores.add(num);
                }
                matriz[i][j].setValores(valores);
            }
        }
        return matriz;
    }

    public void setLambdaFila(int fila, int datos, double lambda1, double lambda2, double lambda3, double lambda4) {
        Celdam celda = new Celdam();
        double num = 0;
        ArrayList<Double> valores = new ArrayList<Double>();
        matriz = twoWays.getMatriz();
        for (int i = 0; i < twoWays.getJ(); i++) {
            valores.clear();
            if (datos != -1) {
                celda.setDatos(datos);
            } else {
                datos = 5;
            }
            if (lambda1 != -1) {
                celda.setLambda1(lambda1);
            } else {
                lambda1 = 0;
            }
            if (lambda2 != -1) {
                celda.setLambda2(lambda2);
            } else {
                lambda2 = 0.1975;
            }
            if (lambda3 != -1) {
                celda.setLambda3(lambda3);
            } else {
                lambda3 = 0.1349;
            }
            if (lambda4 != -1) {
                celda.setLambda4(lambda4);
            } else {
                lambda4 = 0.1349;
            }

            Calculadora c = new Calculadora();

            for (int j = 0; j < celda.getDatos(); j++) {
                num = c.generarDatos(twoWays.getGranMedia(), twoWays.getBeta(), twoWays.getI()-1, twoWays.getJ()-1, celda.getLambda1(), celda.getLambda2(), celda.getLambda3(), celda.getLambda4());
                valores.add(num);
            }
            celda.setValores(valores);
            agregarDato(celda, fila - 1, i, twoWays.getI(), twoWays.getJ());
        }

    }

    public void setLambdaColumna(int columna, int datos, double lambda1, double lambda2, double lambda3, double lambda4) {
        Celdam celda = new Celdam();
        double num = 0;
        ArrayList<Double> valores = new ArrayList<Double>();
        matriz = twoWays.getMatriz();
//        if(matriz==null)
//            matriz = new Celdam[twoWays.getI()][twoWays.getI()];
        for (int i = 0; i < twoWays.getI(); i++) {
            valores.clear();
            if (datos != -1) {
                celda.setDatos(datos);
            } else {
                datos = 5;
            }
            if (lambda1 != -1) {
                celda.setLambda1(lambda1);
            } else {
                lambda1 = 0;
            }
            if (lambda2 != -1) {
                celda.setLambda2(lambda2);
            } else {
                lambda2 = 0.1975;
            }
            if (lambda3 != -1) {
                celda.setLambda3(lambda3);
            } else {
                lambda3 = 0.1349;
            }
            if (lambda4 != -1) {
                celda.setLambda4(lambda4);
            } else {
                lambda4 = 0.1349;
            }

            Calculadora c = new Calculadora();

            for (int j = 0; j < celda.getDatos(); j++) {
                num = c.generarDatos(twoWays.getGranMedia(), twoWays.getBeta(), twoWays.getI()-1, twoWays.getJ()-1, celda.getLambda1(), celda.getLambda2(), celda.getLambda3(), celda.getLambda4());
                valores.add(num);
            }
            celda.setValores(valores);
            agregarDato(celda, i, columna - 1, twoWays.getI(), twoWays.getJ());

        }
    }

    public void setLambdaGeneral(String datos, String lambda1, String lambda2, String lambda3, String lambda4) {

        int dat;
        double lam1, lam2, lam3, lam4;

        if (datos.equals("")) {
            dat = 3;
        } else {
            dat = Integer.parseInt(datos);
        }

        if (lambda1.equals("")) {
            lam1 = 0;
        } else {
            lam1 = Double.parseDouble(lambda1);
        }

        if (lambda2.equals("")) {
            lam2 = 0.1975;
        } else {
            lam2 = Double.parseDouble(lambda2);
        }

        if (lambda3.equals("")) {
            lam3 = 0.1349;
        } else {
            lam3 = Double.parseDouble(lambda3);
        }

        if (lambda4.equals("")) {
            lam4 = 0.1349;
        } else {
            lam4 = Double.parseDouble(lambda4);
        }

//        matriz = twoWays.getMatriz();
//        if(matriz==null)
//            matriz = new Celdam[twoWays.getI()][twoWays.getI()];
        for (int i = 1; i <= twoWays.getI(); i++) {
            setLambdaColumna(i, dat, lam1, lam2, lam3, lam4);
        }

    }

    public void setLambdaFilas(String filas, String datos, String lambda1, String lambda2, String lambda3, String lambda4) {
        String numeros[] = filas.split(",");
        int dat;
        double lam1, lam2, lam3, lam4;

        if (datos.equals("")) {
            dat = 3;
        } else {
            dat = Integer.parseInt(datos);
        }

        if (lambda1.equals("")) {
            lam1 = 0;
        } else {
            lam1 = Double.parseDouble(lambda1);
        }

        if (lambda2.equals("")) {
            lam2 = 0.1975;
        } else {
            lam2 = Double.parseDouble(lambda2);
        }

        if (lambda3.equals("")) {
            lam3 = 0.1349;
        } else {
            lam3 = Double.parseDouble(lambda3);
        }

        if (lambda4.equals("")) {
            lam4 = 0.1349;
        } else {
            lam4 = Double.parseDouble(lambda4);
        }

        for (int i = 0; i < numeros.length; i++) {
            setLambdaFila(Integer.parseInt(numeros[i]), dat, lam1, lam2, lam3, lam4);
        }

    }

    public void setLambdaColumnas(String columnas, String datos, String lambda1, String lambda2, String lambda3, String lambda4) {
        String numeros[] = columnas.split(",");
        int dat;
        double lam1, lam2, lam3, lam4;

        if (datos.equals("")) {
            dat = 3;
        } else {
            dat = Integer.parseInt(datos);
        }

        if (lambda1.equals("")) {
            lam1 = 0;
        } else {
            lam1 = Double.parseDouble(lambda1);
        }

        if (lambda2.equals("")) {
            lam2 = 0.1975;
        } else {
            lam2 = Double.parseDouble(lambda2);
        }

        if (lambda3.equals("")) {
            lam3 = 0.1349;
        } else {
            lam3 = Double.parseDouble(lambda3);
        }

        if (lambda4.equals("")) {
            lam4 = 0.1349;
        } else {
            lam4 = Double.parseDouble(lambda4);
        }

        for (int i = 0; i < numeros.length; i++) {
            setLambdaColumna(Integer.parseInt(numeros[i]), dat, lam1, lam2, lam3, lam4);
        }
    }

    public String validacionesDatos(String filasColumnas, String datos, String lambda1, String lambda2, String lambda3, String lambda4) {
        String respuesta = "";

        String numeros[] = filasColumnas.split(",");




        if (datos.equals("") && lambda1.equals("") && lambda2.equals("") && lambda3.equals("")
                && lambda4.equals("")) {
            return respuesta = "Debe escribir por lo menos un dato para que se pueda actualizar los datos";
        }

        if (datos.equals("")) {
            datos = "0";
        }

        if (lambda1.equals("")) {
            lambda1 = "0";
        }

        if (lambda2.equals("")) {
            lambda2 = "0";
        }

        if (lambda3.equals("")) {
            lambda3 = "0";
        }

        if (lambda4.equals("")) {
            lambda4 = "0";
        }

        for (int i = 0; i < numeros.length; i++) {
            try {
                if (Integer.parseInt(numeros[i]) < 0) {
                    return respuesta = "Los datos no pueden ser negativos";
                }

            } catch (Exception e) {
                return respuesta = "Los datos tienen que ser numeros";
            }

        }

        try {
            if (Integer.parseInt(datos) < 0 || Double.parseDouble(lambda1) < 0
                    || Double.parseDouble(lambda2) < 0 || Double.parseDouble(lambda3) < 0
                    || Double.parseDouble(lambda4) < 0) {
                return respuesta = "Los datos no pueden ser negativos";
            }

        } catch (Exception e) {
            return respuesta = "Los datos tienen que ser numeros";
        }



        return respuesta;
    }

    public void ordenamientoSecuencia() {
        Celdam matriz[][];
        String e = "";
        
        ArrayList<DatosSecuencia> arraySecuencia = new ArrayList();

        Celdam celda = new Celdam();
        matriz = twoWays.getMatriz();
        for (int i = 0; i < twoWays.getI(); i++) {
            ArrayList<Double> array = new ArrayList();
            for (int j = 0; j < twoWays.getJ(); j++) {
                for (int k = 0; k < matriz[i][j].getValores().size(); k++) {
                    array.add(matriz[i][j].getValores().get(k));
                }
            }
            Collections.sort(array);
//            QuickSort qs = new QuickSort();
//            qs.sort(array);
            for (int j = 0; j < twoWays.getJ(); j++) {
                ArrayList arrayOrdenamiento = new ArrayList();
                for (int k = 0; k < matriz[i][j].getValores().size(); k++) {
                    int posicion = array.indexOf(matriz[i][j].getValores().get(k));
                    arrayOrdenamiento.add(posicion+1);
                }
                matriz[i][j].setOrdenamiento(arrayOrdenamiento);
                for (int k = 0; k < matriz[i][j].getValores().size(); k++) {
                    e = arrayOrdenamiento.get(k) + "----->" + matriz[i][j].getValores().get(k);
                    System.out.println();
//                    twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                    Archivos.escrituraArchivos(e);
                }
                e = "--------------------------";
                System.out.println(e);
//                twoWays.setArchivo(twoWays.getArchivo()+" \n"+e);
                Archivos.escrituraArchivos(e);
            }
            int secuencia=1;
            int cont=0;
            arraySecuencia.clear();
            for (int l = 0; l < array.size(); l++) {
                boolean b = false;
                
                for (int j = 0; j < twoWays.getJ(); j++) {
                    for (int k = 0; k < matriz[i][j].getValores().size(); k++) {
                        if (matriz[i][j].getValores().get(k) == array.get(l)) {
                            if(cont!=0&&!(j==arraySecuencia.get(cont-1).getCelda()))
                                secuencia++;
                            DatosSecuencia datosSecuencia = new DatosSecuencia();
                            datosSecuencia.setCelda(j);
                            datosSecuencia.setDato(array.get(l));
                            datosSecuencia.setSecuenacia(secuencia);
                            arraySecuencia.add(datosSecuencia);
                            cont++;
//                            if (arraySecuencia.size() == matriz[i][j].getValores().size()) {
//                                matriz[i][j].setSecuencias(arraySecuencia);
//                                twoWays.getMatriz()[i][j].setSecuencias(arraySecuencia);
//                            }
                            b = true;
                            break;
                        }
                    }                  
                    if (b) {
                        break;
                    }
                }
            }            
        }
        secuencia(arraySecuencia);
    }
    
    public void secuencia(ArrayList<DatosSecuencia> arraySecuencia){
        
        matriz = twoWays.getMatriz();
        for(int i=0;i<twoWays.getI();i++){
            for(int j=0;j<twoWays.getJ();j++){
                ArrayList secuencia = new ArrayList();
                for(int k=0;k<matriz[i][j].getValores().size();k++){
                    for(int t=0;t<arraySecuencia.size();t++){
                        if(matriz[i][j].getValores().get(k)==arraySecuencia.get(t).getDato()){
                            secuencia.add(arraySecuencia.get(t).getSecuenacia());
                            System.out.println("La secuencia para el dato " +
                                    matriz[i][j].getValores().get(k) + " es: "+arraySecuencia.get(t).getSecuenacia());
                        }
                    }
                }                
                matriz[i][j].setSecuencias(secuencia);
            }
        }
    }
}
